package repository

import (
	"context"

	"github.com/google/uuid"
	"gorm.io/gorm"
	"techoiceness.com/aiagent/llm-gateway/internal/entity"
)

// SystemPromptRepository 系统提示词仓库接口
type SystemPromptRepository interface {
	// GetActiveSystemPrompt 获取当前激活的系统提示词
	GetActiveSystemPrompt(ctx context.Context) (*entity.SystemPrompt, error)

	// GetAllSystemPrompts 获取所有系统提示词配置
	GetAllSystemPrompts(ctx context.Context) ([]*entity.SystemPrompt, error)

	// GetSystemPromptByID 根据ID获取系统提示词
	GetSystemPromptByID(ctx context.Context, id uuid.UUID) (*entity.SystemPrompt, error)

	// GetSystemPromptByName 根据名称获取系统提示词
	GetSystemPromptByName(ctx context.Context, name string) (*entity.SystemPrompt, error)

	// CreateSystemPrompt 创建系统提示词
	CreateSystemPrompt(ctx context.Context, systemPrompt *entity.SystemPrompt) error

	// UpdateSystemPrompt 更新系统提示词
	UpdateSystemPrompt(ctx context.Context, systemPrompt *entity.SystemPrompt) error

	// DeleteSystemPrompt 删除系统提示词
	DeleteSystemPrompt(ctx context.Context, id uuid.UUID) error

	// SetActiveSystemPrompt 设置激活的系统提示词
	SetActiveSystemPrompt(ctx context.Context, id uuid.UUID) error

	// InitializeDefaultSystemPrompt 初始化默认系统提示词（如果不存在）
	InitializeDefaultSystemPrompt(ctx context.Context) error
}

// systemPromptRepository 系统提示词仓库实现
type systemPromptRepository struct {
	db *gorm.DB
}

// NewSystemPromptRepository 创建系统提示词仓库
func NewSystemPromptRepository(db *gorm.DB) SystemPromptRepository {
	return &systemPromptRepository{
		db: db,
	}
}

// GetActiveSystemPrompt 获取当前激活的系统提示词
func (r *systemPromptRepository) GetActiveSystemPrompt(ctx context.Context) (*entity.SystemPrompt, error) {
	var systemPrompt entity.SystemPrompt
	err := r.db.WithContext(ctx).Where("is_active = ?", true).First(&systemPrompt).Error
	if err != nil {
		return nil, err
	}
	return &systemPrompt, nil
}

// GetAllSystemPrompts 获取所有系统提示词配置
func (r *systemPromptRepository) GetAllSystemPrompts(ctx context.Context) ([]*entity.SystemPrompt, error) {
	var systemPrompts []*entity.SystemPrompt
	err := r.db.WithContext(ctx).Order("created_at DESC").Find(&systemPrompts).Error
	if err != nil {
		return nil, err
	}
	return systemPrompts, nil
}

// GetSystemPromptByID 根据ID获取系统提示词
func (r *systemPromptRepository) GetSystemPromptByID(ctx context.Context, id uuid.UUID) (*entity.SystemPrompt, error) {
	var systemPrompt entity.SystemPrompt
	err := r.db.WithContext(ctx).Where("id = ?", id).First(&systemPrompt).Error
	if err != nil {
		return nil, err
	}
	return &systemPrompt, nil
}

// GetSystemPromptByName 根据名称获取系统提示词
func (r *systemPromptRepository) GetSystemPromptByName(ctx context.Context, name string) (*entity.SystemPrompt, error) {
	var systemPrompt entity.SystemPrompt
	err := r.db.WithContext(ctx).Where("name = ?", name).First(&systemPrompt).Error
	if err != nil {
		return nil, err
	}
	return &systemPrompt, nil
}

// CreateSystemPrompt 创建系统提示词
func (r *systemPromptRepository) CreateSystemPrompt(ctx context.Context, systemPrompt *entity.SystemPrompt) error {
	return r.db.WithContext(ctx).Create(systemPrompt).Error
}

// UpdateSystemPrompt 更新系统提示词
func (r *systemPromptRepository) UpdateSystemPrompt(ctx context.Context, systemPrompt *entity.SystemPrompt) error {
	return r.db.WithContext(ctx).Save(systemPrompt).Error
}

// DeleteSystemPrompt 删除系统提示词
func (r *systemPromptRepository) DeleteSystemPrompt(ctx context.Context, id uuid.UUID) error {
	return r.db.WithContext(ctx).Delete(&entity.SystemPrompt{}, id).Error
}

// SetActiveSystemPrompt 设置激活的系统提示词
func (r *systemPromptRepository) SetActiveSystemPrompt(ctx context.Context, id uuid.UUID) error {
	return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
		// 先将所有系统提示词设为非激活
		if err := tx.Model(&entity.SystemPrompt{}).Update("is_active", false).Error; err != nil {
			return err
		}

		// 再将指定的系统提示词设为激活
		return tx.Model(&entity.SystemPrompt{}).Where("id = ?", id).Update("is_active", true).Error
	})
}

// InitializeDefaultSystemPrompt 初始化默认系统提示词（如果不存在）
func (r *systemPromptRepository) InitializeDefaultSystemPrompt(ctx context.Context) error {
	// 检查是否已有激活的系统提示词
	var count int64
	if err := r.db.WithContext(ctx).Model(&entity.SystemPrompt{}).Where("is_active = ?", true).Count(&count).Error; err != nil {
		return err
	}

	// 如果没有激活的系统提示词，创建默认的
	if count == 0 {
		defaultPrompt := &entity.SystemPrompt{
			Name:     "default",
			Content:  entity.GetDefaultSystemPrompt(),
			IsActive: true,
		}
		return r.CreateSystemPrompt(ctx, defaultPrompt)
	}

	return nil
}
